package pe.gob.foncodes.ssa.bs.seguridad.domain;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;
import pe.gob.foncodes.ssa.bs.common.domain.EntidadBase;

@Entity
@Table(name = "CONTROL_ACCESO", catalog = "", schema = "SSA")
@NamedQueries({
    @NamedQuery(name = "ControlAcceso.findAll", query = "SELECT c FROM ControlAcceso c"),
    @NamedQuery(name = "ControlAcceso.findByCodZonal", query = "SELECT c FROM ControlAcceso c WHERE c.codZonal = :codZonal"),
    @NamedQuery(name = "ControlAcceso.findById", query = "SELECT c FROM ControlAcceso c WHERE c.id = ?1"),
    @NamedQuery(name = "ControlAcceso.findByReporte", query = "SELECT u.codUsuario"
                                                            + " , CONCAT(u.txtApellidoPaterno, ' ', u.txtApellidoMaterno, ' ', u.txtNombres)"
                                                            + " , ca.codZonal, z.txtZonal, to_char(m.id),m.txtModulo"
                                                            + " , g.txtParametro"
                                                            + " , CONCAT(to_Char(ca.fecRegistro,'dd/mm/yyyy HH:MI:SS'), ' - ', to_Char(ca.fecSalida,'dd/mm/yyyy HH:MI:SS'))"
                                                            + " FROM Zonal z, Usuario u INNER JOIN"
                                                            + " u.controlAccesoList ca INNER JOIN"
                                                            + " ca.nidModulo m, General g"
                                                            + " WHERE ca.tipOperacion = g.id"
                                                            + " AND g.txtDominio = 'TIPO_OPERACION'"
                                                            + " AND u.flgActivo = '1'"
                                                            + " AND u.codZonal = z.codZonal"
                                                            + " AND (UPPER(u.codUsuario) = ?1 OR ?1 IS NULL)"
                                                            + " AND (UPPER(CONCAT(u.txtApellidoPaterno, ' ', u.txtApellidoMaterno, ' ', u.txtNombres)) LIKE ?2 OR ?2 IS NULL)"
                                                            + " AND (to_Date(to_char(ca.fecRegistro,'yyyy-mm-dd'),'yyyy-mm-dd') >=  ?3  OR ?3 IS NULL)"
                                                            + " AND (to_date(to_char(ca.fecRegistro,'yyyy-mm-dd'),'yyyy-mm-dd') <=  ?4  OR ?4 IS NULL)"
                                                            + " AND (m.id = ?5 OR ?5 IS NULL)"
                                                            + " ORDER BY u.codUsuario, ca.fecRegistro DESC, m.txtModulo"),
    @NamedQuery(name = "ControlAcceso.findByReporteSinAcceso", query = "SELECT 	ca.nidUsuario.id,u.codUsuario, "
                                                            + " CONCAT(u.txtApellidoPaterno,' ',u.txtApellidoMaterno,' ',u.txtNombres) AS APENOM,"
                                                            + " z.codZonal,z.txtZonal,ca.nidModulo.id,m.txtModulo,to_char(max(ca.fecRegistro),'dd/mm/yyyy')"
                                                            + " FROM Zonal z, Usuario u "
                                                            + " INNER JOIN u.controlAccesoList ca"
                                                            + " INNER JOIN ca.nidModulo m "
                                                            + " WHERE u.flgActivo = '1'"
                                                            + " AND u.codZonal = z.codZonal"
                                                            + " AND (UPPER(u.codUsuario) = UPPER(?1) OR ?1 IS NULL)"
                                                            + " AND (UPPER(CONCAT(u.txtApellidoPaterno, ' ' ,u.txtApellidoMaterno, ' ', u.txtNombres)) LIKE UPPER(?2) OR ?2 IS NULL)"
                                                            + " AND (m.id = ?3 OR ?3 IS NULL)"
                                                            +" AND ca.nidUsuario NOT IN("
                                                                +" SELECT DISTINCT c.nidUsuario "
                                                                +" FROM ControlAcceso c "
                                                                +" WHERE c.fecRegistro BETWEEN ?4  AND ?5)"
                                                            +" GROUP BY ca.nidUsuario.id, u.codUsuario, CONCAT(u.txtApellidoPaterno,' ',u.txtApellidoMaterno,' ',u.txtNombres), "
                                                            +" z.codZonal,z.txtZonal,ca.nidModulo.id,m.txtModulo"
                                                            +" ORDER BY u.codUsuario,z.codZonal, m.txtModulo"),
    
    @NamedQuery(name = "ControlAcceso.findByNidUsuarioAndTipOperacion", query = "SELECT c"
                                                                        + " FROM ControlAcceso c"
                                                                        + " WHERE c.tipOperacion LIKE ?1 "
                                                                        + " AND c.nidUsuario.id= ?2"
                                                                        + " ORDER BY c.fecRegistro DESC")
})
public class ControlAcceso extends EntidadBase implements Serializable {
    private static final long serialVersionUID = 1L;    
    
    private String txtReferencia;
    private String tipOperacion;
    private Date fecRegistro;
    private String txtSessionid;
    private Date fecSalida;
    private String codZonal;
    private String flgAcceso;
    private Usuario nidUsuario;
    private Modulo nidModulo;

    public ControlAcceso() {
    }

    @Id
    @Basic(optional = false)
    @NotNull
    @SequenceGenerator(schema="SSA", name="SQ_CONTROL_ACCESO",sequenceName="SSA.SQ_CONTROL_ACCESO", allocationSize=1)
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SQ_CONTROL_ACCESO")
    @Column(name = "NID_CONTROL_ACCESO", nullable = false, precision = 0, scale = -127)
    @Override
    public Long getId() {
        return super.getId();
    }
    
    @Column(name = "TXT_REFERENCIA")
    public String getTxtReferencia() {
        return txtReferencia;
    }

    public void setTxtReferencia(String txtReferencia) {
        this.txtReferencia = txtReferencia;
    }

    @Column(name = "TIP_OPERACION")
    public String getTipOperacion() {
        return tipOperacion;
    }

    public void setTipOperacion(String tipOperacion) {
        this.tipOperacion = tipOperacion;
    }

    @Column(name = "FEC_REGISTRO")
    @Temporal(TemporalType.TIMESTAMP)
    public Date getFecRegistro() {
        return fecRegistro;
    }

    public void setFecRegistro(Date fecRegistro) {
        this.fecRegistro = fecRegistro;
    }

    @Column(name = "TXT_CLAVE_USUARIO")
    public String getTxtSessionid() {
        return txtSessionid;
    }

    public void setTxtSessionid(String txtSessionid) {
        this.txtSessionid = txtSessionid;
    }

    @Column(name = "FEC_SALIDA")
    @Temporal(TemporalType.TIMESTAMP)
    public Date getFecSalida() {
        return fecSalida;
    }

    public void setFecSalida(Date fecSalida) {
        this.fecSalida = fecSalida;
    }

    @Basic(optional = false)
    @NotNull
    @Column(name = "COD_ZONAL", length = 2)
    public String getCodZonal() {
        return codZonal;
    }

    public void setCodZonal(String codZonal) {
        this.codZonal = codZonal;
    }

    @Basic(optional = false)
    @NotNull
    @Column(name = "FLG_ACCESO")
    public String getFlgAcceso() {
        return flgAcceso;
    }

    public void setFlgAcceso(String flgAcceso) {
        this.flgAcceso = flgAcceso;
    }

    @Override
    @Column(name = "TXT_IP", length=20)
    public String getIp() {
        return super.getIp();
    }
    
    @JoinColumn(name = "NID_USUARIO", referencedColumnName = "NID_USUARIO")
    @ManyToOne(optional = false)
    public Usuario getNidUsuario() {
        return nidUsuario;
    }

    public void setNidUsuario(Usuario nidUsuario) {
        this.nidUsuario = nidUsuario;
    }

    @JoinColumn(name = "NID_MODULO", referencedColumnName = "NID_MODULO")
    @ManyToOne(optional = false)
    public Modulo getNidModulo() {
        return nidModulo;
    }

    public void setNidModulo(Modulo nidModulo) {
        this.nidModulo = nidModulo;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (getId() != null ? getId().hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof ControlAcceso)) {
            return false;
        }
        ControlAcceso other = (ControlAcceso) object;
        if ((this.getId() == null && other.getId() != null) || (this.getId() != null && !this.getId().equals(other.getId()))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "pe.gob.foncodes.ssa.bs.seguridad.domain.ControlAcceso[ nidControlAcceso=" + getId() + " ]";
    }
    
}
